/**
 * AppController.js
 * 
 * 前端核心控制器 - 协调 UI 模块与通信层
 * 
 * 职责：
 * 1. 初始化所有视图模块（MessageView、InputView、ToolListView、ToolResultView）
 * 2. 协调 UI 模块与 VSCodeAdapter 的交互
 * 3. 处理业务逻辑（消息发送、工具执行、工具确认等）
 * 4. 绑定全局事件和后端消息监听
 */

(function() {
    'use strict';

    class AppController {
        constructor() {
            this.vscode = new window.VSCodeAdapter(); // 用于向后端发送消息，订阅后端的消息

            // 负责消息展示区域的逻辑。动态渲染消息内容（如用户消息、系统消息）。支持消息的滚动、更新等功能。
            this.messageView = new window.MessageView();

            // 负责用户输入区域的逻辑。与 VSCodeAdapter 协作，将用户输入发送到后端。
            this.inputView = new window.InputView({
                onSend: (text, files) => this.handleSend(text, files)
            });

            // 负责工具执行结果面板的逻辑。展示手动调用工具的结果卡片。
            this.toolResultView = new window.ToolResultView();

            // 负责工具列表下拉和参数填写的逻辑。
            this.toolListView = new window.ToolListView({
                onExecute: (id, name, args) => this.handleToolExec(id, name, args)
            });

            // 保存当前执行的工具名称，用于关联结果
            this.pendingToolName = null;

            this._bindGlobalEvents();
            this._registerListeners();

            // 初始化完项目，请求一些历史数据
            this.vscode.post('webviewReady');
            this.vscode.post('requestToolList');
        }        async handleSend(text, files) {
            await window.ErrorBoundary.wrapAsync(async () => {
                this.messageView.addMessage('user', text, files); // 在消息视图添加用户消息
                const loadingMsg = this.messageView.addMessage('assistant', 'Thinking...'); // 添加加载动画
                loadingMsg.classList.add('loading');
                this.vscode.post('sendMessage', { text, attachments: files }); // 将用户消息发送给后端
            }, 'Failed to send message');
        }

        /**
         * 处理手动工具执行
         * @param {string} id - 工具ID
         * @param {string} name - 工具名称
         * @param {object} args - 工具参数
         */
        async handleToolExec(id, name, args) {
            await window.ErrorBoundary.wrapAsync(async () => {
                // 保存工具名称，用于后续关联结果
                this.pendingToolName = name || id;
                // 手动调用工具：直接发送到后端，不在消息面板显示
                this.vscode.post('callTool', { toolId: id, toolName: name, args });
            }, `Failed to execute tool: ${name || id}`);
        }

        handleConfirmationResponse(messageId, approved) {
            // 1. 更新 UI
            this.messageView.updateConfirmationStatus(messageId, approved);
            // 2. 发送给后端
            this.vscode.post('toolConfirmationResponse', { messageId, approved });
        }

        _bindGlobalEvents() {
            const viewToggleBtn = document.getElementById('view-toggle-button');
            const ctxBtn = document.getElementById('context-button');
            
            if (viewToggleBtn) viewToggleBtn.onclick = () => {
                document.getElementById('chat-view').classList.toggle('active');
                document.getElementById('tool-result-view').classList.toggle('active');
            };
            if (ctxBtn) ctxBtn.onclick = () => { // 请求选择工作区文件
                this.vscode.post('requestContext');
            };
        }

        _registerListeners() {
            const v = this.vscode;

            v.on('response', msg => { // 订阅response类型的消息
                const loading = document.querySelector('.msg.loading');
                if(loading) loading.remove();
                this.messageView.addMessage('assistant', msg.text);
            });

            v.on('streamChunk', msg => { // 订阅流式消息
                const loading = document.querySelector('.msg.loading');
                if(loading) loading.remove();
                this.messageView.appendToMessage(msg.messageId, msg.chunk);
            });

            // 暂时注释，后续步骤会重新实现
            v.on('toolList', msg => this.toolListView.renderList(msg.tools));
            
            v.on('toolResult', msg => {
                // 🟢 只有手动调用的工具结果才显示在工具结果面板
                // AI调用的工具(source='ai')不显示在工具面板,仅在消息流中显示
                if (msg.result.source === 'manual') {
                    // 确保结果包含时间戳和工具名称
                    const result = {
                        ...msg.result,
                        timestamp: msg.result.timestamp || Date.now(),
                        toolName: this.pendingToolName || msg.toolName || 'Unknown Tool'
                    };
                    this.toolResultView.addResult(result);
                }
                // 清除保存的工具名称
                this.pendingToolName = null;
            });

            v.on('filesSelected', msg => {
                msg.files.forEach(f => this.inputView.addAttachment(f));
            });
            
            // 🟢 修复: 完整处理工具确认请求
            v.on('toolConfirmation', msg => {
                 this.messageView.addToolConfirmationMessage(
                     msg.toolCall, 
                     msg.messageId, 
                     (approved) => this.handleConfirmationResponse(msg.messageId, approved)
                 );
            });

            v.on('clearSuccess', () => this.messageView.clear());
            
            // 恢复聊天历史记录
            v.on('restoreHistory', msg => {
                this.messageView.restoreHistory(msg.messages);
            });

            // 恢复手动工具执行历史
            v.on('restoreManualHistory', msg => {
                this.toolResultView.restoreManualHistory(msg.history);
            });
        }

        /**
         * 清理资源
         */
        dispose() {
            if (this.vscode) {
                this.vscode.dispose();
            }
            console.log('[AppController] Disposed');
        }
    }

    window.AppController = AppController;
})();